library(readr)
library(tidyverse)
library(forcats)
library(plotly)
library(knitr, warn.conflicts = FALSE, quietly=TRUE)
library(RColorBrewer)
library(stringr)
library(dygraphs)
myPalette <- brewer.pal(8, "YlGn")
vgsales <- read_csv("vgsales.csv")
Rows: 16598 Columns: 11
-- Column specification --------------------------------------------------------------------------------------
Delimiter: ","
chr (5): Name, Platform, Year, Genre, Publisher
dbl (6): Rank, NA_Sales, EU_Sales, JP_Sales, Other_Sales, Global_Sales

i Use `spec()` to retrieve the full column specification for this data.
i Specify the column types or set `show_col_types = FALSE` to quiet this message.

Ältere Plattformen/spiele haben mehr verkäufe bzw Wie hat sich die Anzahl der verkäufe im laufe der jahre entwickelt?

Anzahl der Videospiele aufgelistet nach Platform

grouped <- vgsales  %>% 
  group_by(Platform) %>% 
  summarize(Anzahl =n()) 

ordered <- grouped[order(grouped$Anzahl), decreasing = FALSE]
ordered$Platform <- as_factor(ordered$Platform)


ax <- list(
  title = "Publisher"
)

ay <- list(
  title = "Anzahl"
)
ordered%>%
  plot_ly() %>% 
  add_bars(x=~fct_reorder(Platform,Anzahl, .desc="true"),
           y=~Anzahl,
           name="Game Amount by Platform") %>% 
  layout(title="Game Amount by Platform",
         xaxis = ax,
         yaxis = ay
         
         )

Welche Plattform ist die beste und unterscheidet sich diese nach Region?

grouped <- vgsales  %>% 
  group_by(Platform) %>% 
  summarize(sum(Global_Sales))  %>%
rename(
    Global_Sales = "sum(Global_Sales)"
    )
grouped$Global_Sales<-as_vector(grouped$Global_Sales)
ordered <- grouped[order(grouped$Global_Sales), decreasing = FALSE]
ordered$Platform <- as_factor(ordered$Platform)


ax <- list(
  title = "Platform"
)

ay <- list(
  title = "Global Sales (in mio)"

)


ordered%>%
  plot_ly() %>% 
  add_bars(x=~fct_reorder(Platform,Global_Sales, .desc="true"),
           y=~Global_Sales,
           name="Sales Amount by Platform") %>% 
  layout(title="Sales Amount by Platform",
         xaxis = ax,
         yaxis = ay
         )

● Gibt es Unterschiede in den Regionen/hängt das mit der Anzahl der Einwohner der Region zusammen? (Asian>US>EU)

grouped <- vgsales  %>% 
  group_by(Platform) %>% 
  summarize(sum(EU_Sales))  %>%
rename(
    Global_Sales = "sum(EU_Sales)"
    )
grouped$Global_Sales<-as_vector(grouped$Global_Sales)
ordered <- grouped[order(grouped$Global_Sales), decreasing = FALSE]
ordered$Platform <- as_factor(ordered$Platform)


ax <- list(
  title = "Platform"
)

ay <- list(
  title = "EU Sales (in mio)"

)


ordered%>%
  plot_ly() %>% 
  add_bars(x=~fct_reorder(Platform,Global_Sales, .desc="true"),
           y=~Global_Sales,
           name="EU Sales Amount by Platform") %>% 
  layout(title="EU Sales Amount by Platform",
         xaxis = ax,
         yaxis = ay
         )
ordered%>%
  plot_ly() %>% 
  add_pie(values =~Global_Sales,labels=~Platform,textinfo='label+percent',
           name="EU Sales Amount by Publisher") %>% 
  layout(title="EU Sales Amount by Publisher",
         xaxis = ax,
         yaxis = ay
         )
grouped <- vgsales  %>% 
  group_by(Platform) %>% 
  summarize(sum(NA_Sales))  %>%
rename(
    Global_Sales = "sum(NA_Sales)"
    )
grouped$Global_Sales<-as_vector(grouped$Global_Sales)
ordered <- grouped[order(grouped$Global_Sales), decreasing = FALSE]
ordered$Platform <- as_factor(ordered$Platform)


ax <- list(
  title = "Platform"
)

ay <- list(
  title = "NA Sales (in mio)"

)


ordered%>%
  plot_ly() %>% 
  add_bars(x=~fct_reorder(Platform,Global_Sales, .desc="true"),
           y=~Global_Sales,
           name="NA Sales Amount by Platform") %>% 
  layout(title="NA Sales Amount by Platform",
         xaxis = ax,
         yaxis = ay
         )
ordered%>%
  plot_ly() %>% 
  add_pie(values =~Global_Sales,labels=~Platform,textinfo='label+percent',
           name="NA Sales Amount by Publisher") %>% 
  layout(title="NA Sales Amount by Publisher",
         xaxis = ax,
         yaxis = ay
         )
grouped <- vgsales  %>% 
  group_by(Platform) %>% 
  summarize(sum(JP_Sales))  %>%
rename(
    Global_Sales = "sum(JP_Sales)"
    )
grouped$Global_Sales<-as_vector(grouped$Global_Sales)
ordered <- grouped[order(grouped$Global_Sales), decreasing = FALSE]
ordered$Platform <- as_factor(ordered$Platform)


ax <- list(
  title = "Platform"
)

ay <- list(
  title = "JP Sales (in mio)"

)


ordered%>%
  plot_ly() %>% 
  add_bars(x=~fct_reorder(Platform,Global_Sales, .desc="true"),
           y=~Global_Sales,
           name="JP Sales Amount by Platform") %>% 
  layout(title="JP Sales Amount by Platform",
         xaxis = ax,
         yaxis = ay
         )
ordered%>%
  plot_ly() %>% 
  add_pie(values =~Global_Sales,labels=~Platform,textinfo='label+percent',
           name="JP Sales Amount by Publisher") %>% 
  layout(title="JP Sales Amount by Publisher",
         xaxis = ax,
         yaxis = ay
         )

Bestimmte Entwickler/Publisher häufen sich (Nintendo/EA)

Top Publisher nach Anzahl der Games

grouped <- vgsales  %>% 
  group_by(Publisher) %>% 
  summarize(Anzahl =n()) %>%  
  filter(Anzahl>100) %>% filter(Publisher!="Unknown")

ordered <- grouped[order(grouped$Anzahl), decreasing = FALSE]
ordered$Publisher <-str_remove_all(ordered$Publisher, "Entertainment")
ordered$Publisher <-str_remove_all(ordered$Publisher, "Interactive")
ordered$Publisher <-str_remove_all(ordered$Publisher, "Studios")
ordered$Publisher <- as_factor(ordered$Publisher)


ax <- list(
  title = "Publisher"
)

ay <- list(
  title = "Anzahl"
)
ordered%>%
  plot_ly() %>% 
  add_bars(x=~fct_reorder(Publisher,Anzahl, .desc="true"),
           y=~Anzahl,
           name="Game Amount by Publisher") %>% 
  layout(title="Game Amount by Publisher",
         xaxis = ax,
         yaxis = ay
         
         )

Top Publisher nach Anzahl der Sales

grouped <- vgsales  %>% 
  group_by(Publisher) %>% 
  summarize(Anzahl =n(),sum(Global_Sales)) %>%
  filter(Anzahl>100) %>%
rename(
    Global_Sales = "sum(Global_Sales)"
    )
grouped$Global_Sales<-as_vector(grouped$Global_Sales)
ordered <- grouped[order(grouped$Global_Sales), decreasing = FALSE]
ordered$Publisher <-str_remove_all(ordered$Publisher, "Entertainment")
ordered$Publisher <-str_remove_all(ordered$Publisher, "Interactive")
ordered$Publisher <-str_remove_all(ordered$Publisher, "Studios")
ordered$Publisher <- as_factor(ordered$Publisher)


ax <- list(
  title = "Publisher"
)

ay <- list(
  title = "Global Sales (in mio)"

)


ordered%>%
  plot_ly() %>% 
  add_bars(x=~fct_reorder(Publisher,Global_Sales, .desc="true"),
           y=~Global_Sales,
           name="Sales Amount by Publisher") %>% 
  layout(title="Sales Amount by Publisher",
         xaxis = ax,
         yaxis = ay
         )

● Welche Spiele/Publisher/Genres in welchen Teilen der welt sich häufen (Nintendo in Asien, Shooter in US/EU)

grouped <- vgsales  %>% 
  group_by(Publisher) %>% 
  summarize(Anzahl =n(),sum(EU_Sales)) %>%
  filter(Anzahl>100) %>%
rename(
    Global_Sales = "sum(EU_Sales)"
    )
grouped$Global_Sales<-as_vector(grouped$Global_Sales)
ordered <- grouped[order(grouped$Global_Sales), decreasing = FALSE]
ordered$Publisher <-str_remove_all(ordered$Publisher, "Entertainment")
ordered$Publisher <-str_remove_all(ordered$Publisher, "Interactive")
ordered$Publisher <-str_remove_all(ordered$Publisher, "Studios")
ordered$Publisher <- as_factor(ordered$Publisher)


ax <- list(
  title = "Publisher"
)

ay <- list(
  title = "EU Sales (in mio)"

)

ordered%>%
  plot_ly() %>% 
  add_bars(x=~fct_reorder(Publisher,Global_Sales, .desc="true"),
           y=~Global_Sales,
           name="EU Sales Amount by Platform") %>% 
  layout(title="EU Sales Amount by Platform",
         xaxis = ax,
         yaxis = ay
         )

ordered%>%
  plot_ly() %>% 
  add_pie(values =~Global_Sales,labels=~Publisher,
           name="EU Sales Amount by Publisher") %>% 
  layout(title="EU Sales Amount by Publisher",
         xaxis = ax,
         yaxis = ay
         )
grouped <- vgsales  %>% 
  group_by(Publisher) %>% 
  summarize(Anzahl =n(),sum(NA_Sales)) %>%
  filter(Anzahl>100) %>%
rename(
    Global_Sales = "sum(NA_Sales)"
    )
grouped$Global_Sales<-as_vector(grouped$Global_Sales)
ordered <- grouped[order(grouped$Global_Sales), decreasing = FALSE]
ordered$Publisher <-str_remove_all(ordered$Publisher, "Entertainment")
ordered$Publisher <-str_remove_all(ordered$Publisher, "Interactive")
ordered$Publisher <-str_remove_all(ordered$Publisher, "Studios")
ordered$Publisher <- as_factor(ordered$Publisher)


ax <- list(
  title = "Publisher"
)

ay <- list(
  title = "NA Sales (in mio)"

)

ordered%>%
  plot_ly() %>% 
  add_bars(x=~fct_reorder(Publisher,Global_Sales, .desc="true"),
           y=~Global_Sales,
           name="NA Sales Amount by Platform") %>% 
  layout(title="NA Sales Amount by Platform",
         xaxis = ax,
         yaxis = ay
         )

ordered%>%
  plot_ly() %>% 
  add_pie(values =~Global_Sales,labels=~Publisher,textinfo='label+percent',
           name="NA Sales Amount by Publisher") %>% 
  layout(title="NA Sales Amount by Publisher",
         xaxis = ax,
         yaxis = ay
         )
grouped <- vgsales  %>% 
  group_by(Publisher) %>% 
  summarize(Anzahl =n(),sum(JP_Sales)) %>%
  filter(Anzahl>100) %>%
rename(
    Global_Sales = "sum(JP_Sales)"
    )
grouped$Global_Sales<-as_vector(grouped$Global_Sales)
ordered <- grouped[order(grouped$Global_Sales), decreasing = FALSE]
ordered$Publisher <-str_remove_all(ordered$Publisher, "Entertainment")
ordered$Publisher <-str_remove_all(ordered$Publisher, "Interactive")
ordered$Publisher <-str_remove_all(ordered$Publisher, "Studios")
ordered$Publisher <- as_factor(ordered$Publisher)


ax <- list(
  title = "Publisher"
)

ay <- list(
  title = "JP Sales (in mio)"

)

ordered%>%
  plot_ly() %>% 
  add_bars(x=~fct_reorder(Publisher,Global_Sales, .desc="true"),
           y=~Global_Sales,
           name="JP Sales Amount by Platform") %>% 
  layout(title="JP Sales Amount by Platform",
         xaxis = ax,
         yaxis = ay
         )

ordered%>%
  plot_ly() %>% 
  add_pie(values =~Global_Sales,labels=~Publisher,
           name="JP Sales Amount by Publisher") %>% 
  layout(title="JP Sales Amount by Publisher",
         xaxis = ax,
         yaxis = ay
         )

● Genrenentwicklung über die Jahre

grouped <- vgsales  %>% 
  group_by(Genre) %>% 
  summarize(Anzahl =n())

grouped$Anzahl<-as_vector(grouped$Anzahl)
ordered <- grouped[order(grouped$Anzahl), decreasing = FALSE]
ordered$Genre <- as_factor(ordered$Genre)


ax <- list(
  title = "Genre"
)

ay <- list(
  title = "Anzahl"

)

ordered%>%
  plot_ly() %>% 
  add_bars(x=~fct_reorder(Genre,Anzahl, .desc="true"),
           y=~Anzahl,
           name="Amount by Genre") %>% 
  layout(title="Amount by Genre",
         xaxis = ax,
         yaxis = ay
         )

ordered%>%
  plot_ly() %>% 
  add_pie(values =~Anzahl,labels=~Genre,
           name="Amount by Genre") %>% 
  layout(title="Amount by Genre",
         xaxis = ax,
         yaxis = ay
         )

grouped <- vgsales  %>% 
  group_by(Genre) %>% 
  summarize(sum(Global_Sales))  %>%
rename(
    Global_Sales = "sum(Global_Sales)"
    )
grouped$Global_Sales<-as_vector(grouped$Global_Sales)
ordered <- grouped[order(grouped$Global_Sales), decreasing = FALSE]

ax <- list(
  title = "Genre"
)

ay <- list(
  title = "Sales"

)

ordered%>%
  plot_ly() %>% 
  add_bars(x=~fct_reorder(Genre,Global_Sales, .desc="true"),
           y=~Global_Sales,
           name="Sales by Genre") %>% 
  layout(title="Sales by Genre",
         xaxis = ax,
         yaxis = ay
         )

ordered%>%
  plot_ly() %>% 
  add_pie(values =~Global_Sales,labels=~Genre,
           name="Sales by Genre") %>% 
  layout(title="Sales by Genre",
         xaxis = ax,
         yaxis = ay
        )

grouped <- vgsales  %>% 
  group_by(Genre)
filtered <- grouped %>% select(Year,Genre)
typeof(vgsales)
[1] "list"
typeof(filtered)
[1] "list"
view(filtered)
filtered %>%
plot_ly() %>% 
  add_bars(x=~Year,
           y=~Genre)
dygraph(filtered)
Error in dygraph(filtered) : Unsupported type passed to argument 'data'.

● Gibt es Statistische zusammenhänge zwischen einzelnen Faktoren e.g. Genre -> Sales ● Welche Jahre sind die besten in der Anzahl der releasten games ● Welche Jahre sind die besten in Anzahl Sales pro game (neuer = besser?)

LS0tDQp0aXRsZTogIlZEQSBQcm9qZWt0Ig0Kb3V0cHV0OiANCiAgIGh0bWxfZG9jdW1lbnQgOiBkZWZhdWx0DQogICBodG1sX25vdGVib29rIDogZGVmYXVsdA0KLS0tDQoNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9VFJVRSwgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeShyZWFkcikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShmb3JjYXRzKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGtuaXRyLCB3YXJuLmNvbmZsaWN0cyA9IEZBTFNFLCBxdWlldGx5PVRSVUUpDQpsaWJyYXJ5KFJDb2xvckJyZXdlcikNCmxpYnJhcnkoc3RyaW5ncikNCmxpYnJhcnkoZHlncmFwaHMpDQpteVBhbGV0dGUgPC0gYnJld2VyLnBhbCg4LCAiWWxHbiIpDQp2Z3NhbGVzIDwtIHJlYWRfY3N2KCJ2Z3NhbGVzLmNzdiIpDQpgYGANCsOEbHRlcmUgUGxhdHRmb3JtZW4vc3BpZWxlIGhhYmVuIG1laHIgdmVya8OkdWZlIGJ6dyBXaWUgaGF0IHNpY2ggZGllIEFuemFobCBkZXINCnZlcmvDpHVmZSBpbSBsYXVmZSBkZXIgamFocmUgZW50d2lja2VsdD8NCg0KDQpBbnphaGwgZGVyIFZpZGVvc3BpZWxlIGF1ZmdlbGlzdGV0IG5hY2ggUGxhdGZvcm0NCmBgYHtyIG5vcGxvdCwgZWNobyA9IFRSVUUsIG1lc3NhZ2U9RkFMU0UsIHJlc3VsdHM9J21hcmt1cCcsIGluY2x1ZGUgPUZBTFNFLH0NCnZnc2FsZXMgJT4lIA0KICBwbG90X2x5KA0KICAgIHg9flBsYXRmb3JtLA0KICAgIHN0cm9rZT1JKCJibGFjayIpLA0KICAgIG5hbWU9IkFtb3VudCBieSBQbGF0Zm9ybSIpICU+JQ0KICBsYXlvdXQoDQogICAgdGl0bGU9IkFtb3VudCBieSBQbGF0Zm9ybSIpDQp2Z3NhbGVzICU+JSANCiAgcGxvdF9seSAlPiUgDQogIGFkZF9ib3hwbG90KA0KICAgIHg9flBsYXRmb3JtLA0KICAgIHN0cm9rZT1JKCJibGFjayIpLA0KICAgIG5hbWU9IkFtb3VudCBieSBQbGF0Zm9ybSIpICU+JSANCiAgbGF5b3V0KA0KICAgIHRpdGxlPSJBbW91bnQgYnkgUGxhdGZvcm0iKQ0KDQp2Z3NhbGVzICU+JSANCiAgcGxvdF9seSgpICU+JSANCiAgYWRkX2JhcnMoDQogICAgeD1+R2xvYmFsX1NhbGVzLA0KICAgIHk9flBsYXRmb3JtLA0KICAgIG5hbWU9IlNhbGVzIGJ5IFBsYXRmb3JtIChpbiBtaW8pIikgJT4lIA0KICBsYXlvdXQoDQogICAgdGl0bGU9IlNhbGVzIGJ5IFBsYXRmb3JtIChpbiBtaW8pIikNCg0KYGBgDQpgYGB7ciBwbG90LCBlY2hvID0gVFJVRSxtZXNzYWdlPUZBTFNFLHJlc3VsdHM9J21hcmt1cCcsfQ0KZ3JvdXBlZCA8LSB2Z3NhbGVzICAlPiUgDQogIGdyb3VwX2J5KFBsYXRmb3JtKSAlPiUgDQogIHN1bW1hcml6ZShBbnphaGwgPW4oKSkgDQoNCm9yZGVyZWQgPC0gZ3JvdXBlZFtvcmRlcihncm91cGVkJEFuemFobCksIGRlY3JlYXNpbmcgPSBGQUxTRV0NCm9yZGVyZWQkUGxhdGZvcm0gPC0gYXNfZmFjdG9yKG9yZGVyZWQkUGxhdGZvcm0pDQoNCg0KYXggPC0gbGlzdCgNCiAgdGl0bGUgPSAiUHVibGlzaGVyIg0KKQ0KDQpheSA8LSBsaXN0KA0KICB0aXRsZSA9ICJBbnphaGwiDQopDQpvcmRlcmVkJT4lDQogIHBsb3RfbHkoKSAlPiUgDQogIGFkZF9iYXJzKHg9fmZjdF9yZW9yZGVyKFBsYXRmb3JtLEFuemFobCwgLmRlc2M9InRydWUiKSwNCiAgICAgICAgICAgeT1+QW56YWhsLA0KICAgICAgICAgICBuYW1lPSJHYW1lIEFtb3VudCBieSBQbGF0Zm9ybSIpICU+JSANCiAgbGF5b3V0KHRpdGxlPSJHYW1lIEFtb3VudCBieSBQbGF0Zm9ybSIsDQogICAgICAgICB4YXhpcyA9IGF4LA0KICAgICAgICAgeWF4aXMgPSBheQ0KICAgICAgICAgDQogICAgICAgICApDQpgYGANCldlbGNoZSBQbGF0dGZvcm0gaXN0IGRpZSBiZXN0ZSB1bmQgdW50ZXJzY2hlaWRldCBzaWNoIGRpZXNlIG5hY2ggUmVnaW9uPw0KDQpgYGB7ciBwbG90KFBsYXRmb3JtUmFua2luZ19HbG9iYWwpLCBlY2hvID0gVFJVRSxtZXNzYWdlPUZBTFNFLHJlc3VsdHM9J21hcmt1cCcsfQ0KZ3JvdXBlZCA8LSB2Z3NhbGVzICAlPiUgDQogIGdyb3VwX2J5KFBsYXRmb3JtKSAlPiUgDQogIHN1bW1hcml6ZShzdW0oR2xvYmFsX1NhbGVzKSkgICU+JQ0KcmVuYW1lKA0KICAgIEdsb2JhbF9TYWxlcyA9ICJzdW0oR2xvYmFsX1NhbGVzKSINCiAgICApDQpncm91cGVkJEdsb2JhbF9TYWxlczwtYXNfdmVjdG9yKGdyb3VwZWQkR2xvYmFsX1NhbGVzKQ0Kb3JkZXJlZCA8LSBncm91cGVkW29yZGVyKGdyb3VwZWQkR2xvYmFsX1NhbGVzKSwgZGVjcmVhc2luZyA9IEZBTFNFXQ0Kb3JkZXJlZCRQbGF0Zm9ybSA8LSBhc19mYWN0b3Iob3JkZXJlZCRQbGF0Zm9ybSkNCg0KDQpheCA8LSBsaXN0KA0KICB0aXRsZSA9ICJQbGF0Zm9ybSINCikNCg0KYXkgPC0gbGlzdCgNCiAgdGl0bGUgPSAiR2xvYmFsIFNhbGVzIChpbiBtaW8pIg0KDQopDQoNCg0Kb3JkZXJlZCU+JQ0KICBwbG90X2x5KCkgJT4lIA0KICBhZGRfYmFycyh4PX5mY3RfcmVvcmRlcihQbGF0Zm9ybSxHbG9iYWxfU2FsZXMsIC5kZXNjPSJ0cnVlIiksDQogICAgICAgICAgIHk9fkdsb2JhbF9TYWxlcywNCiAgICAgICAgICAgbmFtZT0iU2FsZXMgQW1vdW50IGJ5IFBsYXRmb3JtIikgJT4lIA0KICBsYXlvdXQodGl0bGU9IlNhbGVzIEFtb3VudCBieSBQbGF0Zm9ybSIsDQogICAgICAgICB4YXhpcyA9IGF4LA0KICAgICAgICAgeWF4aXMgPSBheQ0KICAgICAgICAgKQ0KYGBgDQril48gR2lidCBlcyBVbnRlcnNjaGllZGUgaW4gZGVuIFJlZ2lvbmVuL2jDpG5ndCBkYXMgbWl0IGRlciBBbnphaGwgZGVyIEVpbndvaG5lciBkZXINClJlZ2lvbiB6dXNhbW1lbj8gKEFzaWFuPlVTPkVVKQ0KDQpgYGB7ciBwbG90KFBsYXRmb3JtUmFua2luZ19FVSksIGVjaG8gPSBUUlVFLG1lc3NhZ2U9RkFMU0UscmVzdWx0cz0nbWFya3VwJyx9DQpncm91cGVkIDwtIHZnc2FsZXMgICU+JSANCiAgZ3JvdXBfYnkoUGxhdGZvcm0pICU+JSANCiAgc3VtbWFyaXplKHN1bShFVV9TYWxlcykpICAlPiUNCnJlbmFtZSgNCiAgICBHbG9iYWxfU2FsZXMgPSAic3VtKEVVX1NhbGVzKSINCiAgICApDQpncm91cGVkJEdsb2JhbF9TYWxlczwtYXNfdmVjdG9yKGdyb3VwZWQkR2xvYmFsX1NhbGVzKQ0Kb3JkZXJlZCA8LSBncm91cGVkW29yZGVyKGdyb3VwZWQkR2xvYmFsX1NhbGVzKSwgZGVjcmVhc2luZyA9IEZBTFNFXQ0Kb3JkZXJlZCRQbGF0Zm9ybSA8LSBhc19mYWN0b3Iob3JkZXJlZCRQbGF0Zm9ybSkNCg0KDQpheCA8LSBsaXN0KA0KICB0aXRsZSA9ICJQbGF0Zm9ybSINCikNCg0KYXkgPC0gbGlzdCgNCiAgdGl0bGUgPSAiRVUgU2FsZXMgKGluIG1pbykiDQoNCikNCg0KDQpvcmRlcmVkJT4lDQogIHBsb3RfbHkoKSAlPiUgDQogIGFkZF9iYXJzKHg9fmZjdF9yZW9yZGVyKFBsYXRmb3JtLEdsb2JhbF9TYWxlcywgLmRlc2M9InRydWUiKSwNCiAgICAgICAgICAgeT1+R2xvYmFsX1NhbGVzLA0KICAgICAgICAgICBuYW1lPSJFVSBTYWxlcyBBbW91bnQgYnkgUGxhdGZvcm0iKSAlPiUgDQogIGxheW91dCh0aXRsZT0iRVUgU2FsZXMgQW1vdW50IGJ5IFBsYXRmb3JtIiwNCiAgICAgICAgIHhheGlzID0gYXgsDQogICAgICAgICB5YXhpcyA9IGF5DQogICAgICAgICApDQpvcmRlcmVkJT4lDQogIHBsb3RfbHkoKSAlPiUgDQogIGFkZF9waWUodmFsdWVzID1+R2xvYmFsX1NhbGVzLGxhYmVscz1+UGxhdGZvcm0sdGV4dGluZm89J2xhYmVsK3BlcmNlbnQnLA0KICAgICAgICAgICBuYW1lPSJFVSBTYWxlcyBBbW91bnQgYnkgUHVibGlzaGVyIikgJT4lIA0KICBsYXlvdXQodGl0bGU9IkVVIFNhbGVzIEFtb3VudCBieSBQdWJsaXNoZXIiLA0KICAgICAgICAgeGF4aXMgPSBheCwNCiAgICAgICAgIHlheGlzID0gYXkNCiAgICAgICAgICkNCmBgYA0KDQpgYGB7ciBwbG90KFBsYXRmb3JtUmFua2luZ19OQSksIGVjaG8gPSBUUlVFLG1lc3NhZ2U9RkFMU0UscmVzdWx0cz0nbWFya3VwJyx9DQpncm91cGVkIDwtIHZnc2FsZXMgICU+JSANCiAgZ3JvdXBfYnkoUGxhdGZvcm0pICU+JSANCiAgc3VtbWFyaXplKHN1bShOQV9TYWxlcykpICAlPiUNCnJlbmFtZSgNCiAgICBHbG9iYWxfU2FsZXMgPSAic3VtKE5BX1NhbGVzKSINCiAgICApDQpncm91cGVkJEdsb2JhbF9TYWxlczwtYXNfdmVjdG9yKGdyb3VwZWQkR2xvYmFsX1NhbGVzKQ0Kb3JkZXJlZCA8LSBncm91cGVkW29yZGVyKGdyb3VwZWQkR2xvYmFsX1NhbGVzKSwgZGVjcmVhc2luZyA9IEZBTFNFXQ0Kb3JkZXJlZCRQbGF0Zm9ybSA8LSBhc19mYWN0b3Iob3JkZXJlZCRQbGF0Zm9ybSkNCg0KDQpheCA8LSBsaXN0KA0KICB0aXRsZSA9ICJQbGF0Zm9ybSINCikNCg0KYXkgPC0gbGlzdCgNCiAgdGl0bGUgPSAiTkEgU2FsZXMgKGluIG1pbykiDQoNCikNCg0KDQpvcmRlcmVkJT4lDQogIHBsb3RfbHkoKSAlPiUgDQogIGFkZF9iYXJzKHg9fmZjdF9yZW9yZGVyKFBsYXRmb3JtLEdsb2JhbF9TYWxlcywgLmRlc2M9InRydWUiKSwNCiAgICAgICAgICAgeT1+R2xvYmFsX1NhbGVzLA0KICAgICAgICAgICBuYW1lPSJOQSBTYWxlcyBBbW91bnQgYnkgUGxhdGZvcm0iKSAlPiUgDQogIGxheW91dCh0aXRsZT0iTkEgU2FsZXMgQW1vdW50IGJ5IFBsYXRmb3JtIiwNCiAgICAgICAgIHhheGlzID0gYXgsDQogICAgICAgICB5YXhpcyA9IGF5DQogICAgICAgICApDQpvcmRlcmVkJT4lDQogIHBsb3RfbHkoKSAlPiUgDQogIGFkZF9waWUodmFsdWVzID1+R2xvYmFsX1NhbGVzLGxhYmVscz1+UGxhdGZvcm0sdGV4dGluZm89J2xhYmVsK3BlcmNlbnQnLA0KICAgICAgICAgICBuYW1lPSJOQSBTYWxlcyBBbW91bnQgYnkgUHVibGlzaGVyIikgJT4lIA0KICBsYXlvdXQodGl0bGU9Ik5BIFNhbGVzIEFtb3VudCBieSBQdWJsaXNoZXIiLA0KICAgICAgICAgeGF4aXMgPSBheCwNCiAgICAgICAgIHlheGlzID0gYXkNCiAgICAgICAgICkNCmBgYA0KDQpgYGB7ciBwbG90KFBsYXRmb3JtUmFua2luZ19KUCksIGVjaG8gPSBUUlVFLG1lc3NhZ2U9RkFMU0UscmVzdWx0cz0nbWFya3VwJyx9DQpncm91cGVkIDwtIHZnc2FsZXMgICU+JSANCiAgZ3JvdXBfYnkoUGxhdGZvcm0pICU+JSANCiAgc3VtbWFyaXplKHN1bShKUF9TYWxlcykpICAlPiUNCnJlbmFtZSgNCiAgICBHbG9iYWxfU2FsZXMgPSAic3VtKEpQX1NhbGVzKSINCiAgICApDQpncm91cGVkJEdsb2JhbF9TYWxlczwtYXNfdmVjdG9yKGdyb3VwZWQkR2xvYmFsX1NhbGVzKQ0Kb3JkZXJlZCA8LSBncm91cGVkW29yZGVyKGdyb3VwZWQkR2xvYmFsX1NhbGVzKSwgZGVjcmVhc2luZyA9IEZBTFNFXQ0Kb3JkZXJlZCRQbGF0Zm9ybSA8LSBhc19mYWN0b3Iob3JkZXJlZCRQbGF0Zm9ybSkNCg0KDQpheCA8LSBsaXN0KA0KICB0aXRsZSA9ICJQbGF0Zm9ybSINCikNCg0KYXkgPC0gbGlzdCgNCiAgdGl0bGUgPSAiSlAgU2FsZXMgKGluIG1pbykiDQoNCikNCg0KDQpvcmRlcmVkJT4lDQogIHBsb3RfbHkoKSAlPiUgDQogIGFkZF9iYXJzKHg9fmZjdF9yZW9yZGVyKFBsYXRmb3JtLEdsb2JhbF9TYWxlcywgLmRlc2M9InRydWUiKSwNCiAgICAgICAgICAgeT1+R2xvYmFsX1NhbGVzLA0KICAgICAgICAgICBuYW1lPSJKUCBTYWxlcyBBbW91bnQgYnkgUGxhdGZvcm0iKSAlPiUgDQogIGxheW91dCh0aXRsZT0iSlAgU2FsZXMgQW1vdW50IGJ5IFBsYXRmb3JtIiwNCiAgICAgICAgIHhheGlzID0gYXgsDQogICAgICAgICB5YXhpcyA9IGF5DQogICAgICAgICApDQpvcmRlcmVkJT4lDQogIHBsb3RfbHkoKSAlPiUgDQogIGFkZF9waWUodmFsdWVzID1+R2xvYmFsX1NhbGVzLGxhYmVscz1+UGxhdGZvcm0sdGV4dGluZm89J2xhYmVsK3BlcmNlbnQnLA0KICAgICAgICAgICBuYW1lPSJKUCBTYWxlcyBBbW91bnQgYnkgUHVibGlzaGVyIikgJT4lIA0KICBsYXlvdXQodGl0bGU9IkpQIFNhbGVzIEFtb3VudCBieSBQdWJsaXNoZXIiLA0KICAgICAgICAgeGF4aXMgPSBheCwNCiAgICAgICAgIHlheGlzID0gYXkNCiAgICAgICAgICkNCmBgYA0KQmVzdGltbXRlIEVudHdpY2tsZXIvUHVibGlzaGVyIGjDpHVmZW4gc2ljaCAoTmludGVuZG8vRUEpDQoNCg0KVG9wIFB1Ymxpc2hlciBuYWNoIEFuemFobCBkZXIgR2FtZXMNCmBgYHtyIHBsb3QyLCBlY2hvID0gVFJVRSwgbWVzc2FnZT1GQUxTRSwgcmVzdWx0cz0nbWFya3VwJywgfQ0KZ3JvdXBlZCA8LSB2Z3NhbGVzICAlPiUgDQogIGdyb3VwX2J5KFB1Ymxpc2hlcikgJT4lIA0KICBzdW1tYXJpemUoQW56YWhsID1uKCkpICU+JSAgDQogIGZpbHRlcihBbnphaGw+MTAwKSAlPiUgZmlsdGVyKFB1Ymxpc2hlciE9IlVua25vd24iKQ0KDQpvcmRlcmVkIDwtIGdyb3VwZWRbb3JkZXIoZ3JvdXBlZCRBbnphaGwpLCBkZWNyZWFzaW5nID0gRkFMU0VdDQpvcmRlcmVkJFB1Ymxpc2hlciA8LXN0cl9yZW1vdmVfYWxsKG9yZGVyZWQkUHVibGlzaGVyLCAiRW50ZXJ0YWlubWVudCIpDQpvcmRlcmVkJFB1Ymxpc2hlciA8LXN0cl9yZW1vdmVfYWxsKG9yZGVyZWQkUHVibGlzaGVyLCAiSW50ZXJhY3RpdmUiKQ0Kb3JkZXJlZCRQdWJsaXNoZXIgPC1zdHJfcmVtb3ZlX2FsbChvcmRlcmVkJFB1Ymxpc2hlciwgIlN0dWRpb3MiKQ0Kb3JkZXJlZCRQdWJsaXNoZXIgPC0gYXNfZmFjdG9yKG9yZGVyZWQkUHVibGlzaGVyKQ0KDQoNCmF4IDwtIGxpc3QoDQogIHRpdGxlID0gIlB1Ymxpc2hlciINCikNCg0KYXkgPC0gbGlzdCgNCiAgdGl0bGUgPSAiQW56YWhsIg0KKQ0Kb3JkZXJlZCU+JQ0KICBwbG90X2x5KCkgJT4lIA0KICBhZGRfYmFycyh4PX5mY3RfcmVvcmRlcihQdWJsaXNoZXIsQW56YWhsLCAuZGVzYz0idHJ1ZSIpLA0KICAgICAgICAgICB5PX5BbnphaGwsDQogICAgICAgICAgIG5hbWU9IkdhbWUgQW1vdW50IGJ5IFB1Ymxpc2hlciIpICU+JSANCiAgbGF5b3V0KHRpdGxlPSJHYW1lIEFtb3VudCBieSBQdWJsaXNoZXIiLA0KICAgICAgICAgeGF4aXMgPSBheCwNCiAgICAgICAgIHlheGlzID0gYXkNCiAgICAgICAgIA0KICAgICAgICAgKQ0KYGBgDQpUb3AgUHVibGlzaGVyIG5hY2ggQW56YWhsIGRlciBTYWxlcw0KDQpgYGB7ciBwbG90KFB1Ymxpc2hlclJhbmtpbmdfR2xvYmFsKSwgZWNobyA9IFRSVUUsIG1lc3NhZ2U9RkFMU0UsIHJlc3VsdHM9J21hcmt1cCcsIH0NCmdyb3VwZWQgPC0gdmdzYWxlcyAgJT4lIA0KICBncm91cF9ieShQdWJsaXNoZXIpICU+JSANCiAgc3VtbWFyaXplKEFuemFobCA9bigpLHN1bShHbG9iYWxfU2FsZXMpKSAlPiUNCiAgZmlsdGVyKEFuemFobD4xMDApICU+JQ0KcmVuYW1lKA0KICAgIEdsb2JhbF9TYWxlcyA9ICJzdW0oR2xvYmFsX1NhbGVzKSINCiAgICApDQpncm91cGVkJEdsb2JhbF9TYWxlczwtYXNfdmVjdG9yKGdyb3VwZWQkR2xvYmFsX1NhbGVzKQ0Kb3JkZXJlZCA8LSBncm91cGVkW29yZGVyKGdyb3VwZWQkR2xvYmFsX1NhbGVzKSwgZGVjcmVhc2luZyA9IEZBTFNFXQ0Kb3JkZXJlZCRQdWJsaXNoZXIgPC1zdHJfcmVtb3ZlX2FsbChvcmRlcmVkJFB1Ymxpc2hlciwgIkVudGVydGFpbm1lbnQiKQ0Kb3JkZXJlZCRQdWJsaXNoZXIgPC1zdHJfcmVtb3ZlX2FsbChvcmRlcmVkJFB1Ymxpc2hlciwgIkludGVyYWN0aXZlIikNCm9yZGVyZWQkUHVibGlzaGVyIDwtc3RyX3JlbW92ZV9hbGwob3JkZXJlZCRQdWJsaXNoZXIsICJTdHVkaW9zIikNCm9yZGVyZWQkUHVibGlzaGVyIDwtIGFzX2ZhY3RvcihvcmRlcmVkJFB1Ymxpc2hlcikNCg0KDQpheCA8LSBsaXN0KA0KICB0aXRsZSA9ICJQdWJsaXNoZXIiDQopDQoNCmF5IDwtIGxpc3QoDQogIHRpdGxlID0gIkdsb2JhbCBTYWxlcyAoaW4gbWlvKSINCg0KKQ0KDQoNCm9yZGVyZWQlPiUNCiAgcGxvdF9seSgpICU+JSANCiAgYWRkX2JhcnMoeD1+ZmN0X3Jlb3JkZXIoUHVibGlzaGVyLEdsb2JhbF9TYWxlcywgLmRlc2M9InRydWUiKSwNCiAgICAgICAgICAgeT1+R2xvYmFsX1NhbGVzLA0KICAgICAgICAgICBuYW1lPSJTYWxlcyBBbW91bnQgYnkgUHVibGlzaGVyIikgJT4lIA0KICBsYXlvdXQodGl0bGU9IlNhbGVzIEFtb3VudCBieSBQdWJsaXNoZXIiLA0KICAgICAgICAgeGF4aXMgPSBheCwNCiAgICAgICAgIHlheGlzID0gYXkNCiAgICAgICAgICkNCmBgYA0KDQril48gV2VsY2hlIFNwaWVsZS9QdWJsaXNoZXIvR2VucmVzIGluIHdlbGNoZW4gVGVpbGVuIGRlciB3ZWx0IHNpY2ggaMOkdWZlbiAoTmludGVuZG8gaW4NCkFzaWVuLCBTaG9vdGVyIGluIFVTL0VVKQ0KDQpgYGB7ciBwbG90KFB1Ymxpc2hlclJhbmtpbmdfRVUpLCBlY2hvID0gVFJVRSwgbWVzc2FnZT1GQUxTRSwgcmVzdWx0cz0nbWFya3VwJywgfQ0KZ3JvdXBlZCA8LSB2Z3NhbGVzICAlPiUgDQogIGdyb3VwX2J5KFB1Ymxpc2hlcikgJT4lIA0KICBzdW1tYXJpemUoQW56YWhsID1uKCksc3VtKEVVX1NhbGVzKSkgJT4lDQogIGZpbHRlcihBbnphaGw+MTAwKSAlPiUNCnJlbmFtZSgNCiAgICBHbG9iYWxfU2FsZXMgPSAic3VtKEVVX1NhbGVzKSINCiAgICApDQpncm91cGVkJEdsb2JhbF9TYWxlczwtYXNfdmVjdG9yKGdyb3VwZWQkR2xvYmFsX1NhbGVzKQ0Kb3JkZXJlZCA8LSBncm91cGVkW29yZGVyKGdyb3VwZWQkR2xvYmFsX1NhbGVzKSwgZGVjcmVhc2luZyA9IEZBTFNFXQ0Kb3JkZXJlZCRQdWJsaXNoZXIgPC1zdHJfcmVtb3ZlX2FsbChvcmRlcmVkJFB1Ymxpc2hlciwgIkVudGVydGFpbm1lbnQiKQ0Kb3JkZXJlZCRQdWJsaXNoZXIgPC1zdHJfcmVtb3ZlX2FsbChvcmRlcmVkJFB1Ymxpc2hlciwgIkludGVyYWN0aXZlIikNCm9yZGVyZWQkUHVibGlzaGVyIDwtc3RyX3JlbW92ZV9hbGwob3JkZXJlZCRQdWJsaXNoZXIsICJTdHVkaW9zIikNCm9yZGVyZWQkUHVibGlzaGVyIDwtIGFzX2ZhY3RvcihvcmRlcmVkJFB1Ymxpc2hlcikNCg0KDQpheCA8LSBsaXN0KA0KICB0aXRsZSA9ICJQdWJsaXNoZXIiDQopDQoNCmF5IDwtIGxpc3QoDQogIHRpdGxlID0gIkVVIFNhbGVzIChpbiBtaW8pIg0KDQopDQoNCm9yZGVyZWQlPiUNCiAgcGxvdF9seSgpICU+JSANCiAgYWRkX2JhcnMoeD1+ZmN0X3Jlb3JkZXIoUHVibGlzaGVyLEdsb2JhbF9TYWxlcywgLmRlc2M9InRydWUiKSwNCiAgICAgICAgICAgeT1+R2xvYmFsX1NhbGVzLA0KICAgICAgICAgICBuYW1lPSJFVSBTYWxlcyBBbW91bnQgYnkgUGxhdGZvcm0iKSAlPiUgDQogIGxheW91dCh0aXRsZT0iRVUgU2FsZXMgQW1vdW50IGJ5IFBsYXRmb3JtIiwNCiAgICAgICAgIHhheGlzID0gYXgsDQogICAgICAgICB5YXhpcyA9IGF5DQogICAgICAgICApDQoNCm9yZGVyZWQlPiUNCiAgcGxvdF9seSgpICU+JSANCiAgYWRkX3BpZSh2YWx1ZXMgPX5HbG9iYWxfU2FsZXMsbGFiZWxzPX5QdWJsaXNoZXIsDQogICAgICAgICAgIG5hbWU9IkVVIFNhbGVzIEFtb3VudCBieSBQdWJsaXNoZXIiKSAlPiUgDQogIGxheW91dCh0aXRsZT0iRVUgU2FsZXMgQW1vdW50IGJ5IFB1Ymxpc2hlciIsDQogICAgICAgICB4YXhpcyA9IGF4LA0KICAgICAgICAgeWF4aXMgPSBheQ0KICAgICAgICAgKQ0KYGBgDQoNCmBgYHtyIHBsb3QoUHVibGlzaGVyUmFua2luZ19OQSksIGVjaG8gPSBUUlVFLCBtZXNzYWdlPUZBTFNFLCByZXN1bHRzPSdtYXJrdXAnLCB9DQpncm91cGVkIDwtIHZnc2FsZXMgICU+JSANCiAgZ3JvdXBfYnkoUHVibGlzaGVyKSAlPiUgDQogIHN1bW1hcml6ZShBbnphaGwgPW4oKSxzdW0oTkFfU2FsZXMpKSAlPiUNCiAgZmlsdGVyKEFuemFobD4xMDApICU+JQ0KcmVuYW1lKA0KICAgIEdsb2JhbF9TYWxlcyA9ICJzdW0oTkFfU2FsZXMpIg0KICAgICkNCmdyb3VwZWQkR2xvYmFsX1NhbGVzPC1hc192ZWN0b3IoZ3JvdXBlZCRHbG9iYWxfU2FsZXMpDQpvcmRlcmVkIDwtIGdyb3VwZWRbb3JkZXIoZ3JvdXBlZCRHbG9iYWxfU2FsZXMpLCBkZWNyZWFzaW5nID0gRkFMU0VdDQpvcmRlcmVkJFB1Ymxpc2hlciA8LXN0cl9yZW1vdmVfYWxsKG9yZGVyZWQkUHVibGlzaGVyLCAiRW50ZXJ0YWlubWVudCIpDQpvcmRlcmVkJFB1Ymxpc2hlciA8LXN0cl9yZW1vdmVfYWxsKG9yZGVyZWQkUHVibGlzaGVyLCAiSW50ZXJhY3RpdmUiKQ0Kb3JkZXJlZCRQdWJsaXNoZXIgPC1zdHJfcmVtb3ZlX2FsbChvcmRlcmVkJFB1Ymxpc2hlciwgIlN0dWRpb3MiKQ0Kb3JkZXJlZCRQdWJsaXNoZXIgPC0gYXNfZmFjdG9yKG9yZGVyZWQkUHVibGlzaGVyKQ0KDQoNCmF4IDwtIGxpc3QoDQogIHRpdGxlID0gIlB1Ymxpc2hlciINCikNCg0KYXkgPC0gbGlzdCgNCiAgdGl0bGUgPSAiTkEgU2FsZXMgKGluIG1pbykiDQoNCikNCg0Kb3JkZXJlZCU+JQ0KICBwbG90X2x5KCkgJT4lIA0KICBhZGRfYmFycyh4PX5mY3RfcmVvcmRlcihQdWJsaXNoZXIsR2xvYmFsX1NhbGVzLCAuZGVzYz0idHJ1ZSIpLA0KICAgICAgICAgICB5PX5HbG9iYWxfU2FsZXMsDQogICAgICAgICAgIG5hbWU9Ik5BIFNhbGVzIEFtb3VudCBieSBQbGF0Zm9ybSIpICU+JSANCiAgbGF5b3V0KHRpdGxlPSJOQSBTYWxlcyBBbW91bnQgYnkgUGxhdGZvcm0iLA0KICAgICAgICAgeGF4aXMgPSBheCwNCiAgICAgICAgIHlheGlzID0gYXkNCiAgICAgICAgICkNCg0Kb3JkZXJlZCU+JQ0KICBwbG90X2x5KCkgJT4lIA0KICBhZGRfcGllKHZhbHVlcyA9fkdsb2JhbF9TYWxlcyxsYWJlbHM9flB1Ymxpc2hlcix0ZXh0aW5mbz0nbGFiZWwrcGVyY2VudCcsDQogICAgICAgICAgIG5hbWU9Ik5BIFNhbGVzIEFtb3VudCBieSBQdWJsaXNoZXIiKSAlPiUgDQogIGxheW91dCh0aXRsZT0iTkEgU2FsZXMgQW1vdW50IGJ5IFB1Ymxpc2hlciIsDQogICAgICAgICB4YXhpcyA9IGF4LA0KICAgICAgICAgeWF4aXMgPSBheQ0KICAgICAgICAgKQ0KYGBgDQoNCmBgYHtyIHBsb3QoUHVibGlzaGVyUmFua2luZ19KUCksIGVjaG8gPSBUUlVFLCBtZXNzYWdlPUZBTFNFLCByZXN1bHRzPSdtYXJrdXAnLCB9DQpncm91cGVkIDwtIHZnc2FsZXMgICU+JSANCiAgZ3JvdXBfYnkoUHVibGlzaGVyKSAlPiUgDQogIHN1bW1hcml6ZShBbnphaGwgPW4oKSxzdW0oSlBfU2FsZXMpKSAlPiUNCiAgZmlsdGVyKEFuemFobD4xMDApICU+JQ0KcmVuYW1lKA0KICAgIEdsb2JhbF9TYWxlcyA9ICJzdW0oSlBfU2FsZXMpIg0KICAgICkNCmdyb3VwZWQkR2xvYmFsX1NhbGVzPC1hc192ZWN0b3IoZ3JvdXBlZCRHbG9iYWxfU2FsZXMpDQpvcmRlcmVkIDwtIGdyb3VwZWRbb3JkZXIoZ3JvdXBlZCRHbG9iYWxfU2FsZXMpLCBkZWNyZWFzaW5nID0gRkFMU0VdDQpvcmRlcmVkJFB1Ymxpc2hlciA8LXN0cl9yZW1vdmVfYWxsKG9yZGVyZWQkUHVibGlzaGVyLCAiRW50ZXJ0YWlubWVudCIpDQpvcmRlcmVkJFB1Ymxpc2hlciA8LXN0cl9yZW1vdmVfYWxsKG9yZGVyZWQkUHVibGlzaGVyLCAiSW50ZXJhY3RpdmUiKQ0Kb3JkZXJlZCRQdWJsaXNoZXIgPC1zdHJfcmVtb3ZlX2FsbChvcmRlcmVkJFB1Ymxpc2hlciwgIlN0dWRpb3MiKQ0Kb3JkZXJlZCRQdWJsaXNoZXIgPC0gYXNfZmFjdG9yKG9yZGVyZWQkUHVibGlzaGVyKQ0KDQoNCmF4IDwtIGxpc3QoDQogIHRpdGxlID0gIlB1Ymxpc2hlciINCikNCg0KYXkgPC0gbGlzdCgNCiAgdGl0bGUgPSAiSlAgU2FsZXMgKGluIG1pbykiDQoNCikNCg0Kb3JkZXJlZCU+JQ0KICBwbG90X2x5KCkgJT4lIA0KICBhZGRfYmFycyh4PX5mY3RfcmVvcmRlcihQdWJsaXNoZXIsR2xvYmFsX1NhbGVzLCAuZGVzYz0idHJ1ZSIpLA0KICAgICAgICAgICB5PX5HbG9iYWxfU2FsZXMsDQogICAgICAgICAgIG5hbWU9IkpQIFNhbGVzIEFtb3VudCBieSBQbGF0Zm9ybSIpICU+JSANCiAgbGF5b3V0KHRpdGxlPSJKUCBTYWxlcyBBbW91bnQgYnkgUGxhdGZvcm0iLA0KICAgICAgICAgeGF4aXMgPSBheCwNCiAgICAgICAgIHlheGlzID0gYXkNCiAgICAgICAgICkNCg0Kb3JkZXJlZCU+JQ0KICBwbG90X2x5KCkgJT4lIA0KICBhZGRfcGllKHZhbHVlcyA9fkdsb2JhbF9TYWxlcyxsYWJlbHM9flB1Ymxpc2hlciwNCiAgICAgICAgICAgbmFtZT0iSlAgU2FsZXMgQW1vdW50IGJ5IFB1Ymxpc2hlciIpICU+JSANCiAgbGF5b3V0KHRpdGxlPSJKUCBTYWxlcyBBbW91bnQgYnkgUHVibGlzaGVyIiwNCiAgICAgICAgIHhheGlzID0gYXgsDQogICAgICAgICB5YXhpcyA9IGF5DQogICAgICAgICApDQpgYGANCg0K4pePIEdlbnJlbmVudHdpY2tsdW5nIMO8YmVyIGRpZSBKYWhyZQ0KYGBge3IgcGxvdChHZW5yZUFtb3VudF9HTG9iYWwpLCBlY2hvID0gVFJVRSwgbWVzc2FnZT1GQUxTRSwgcmVzdWx0cz0nbWFya3VwJywgfQ0KZ3JvdXBlZCA8LSB2Z3NhbGVzICAlPiUgDQogIGdyb3VwX2J5KEdlbnJlKSAlPiUgDQogIHN1bW1hcml6ZShBbnphaGwgPW4oKSkNCg0KZ3JvdXBlZCRBbnphaGw8LWFzX3ZlY3Rvcihncm91cGVkJEFuemFobCkNCm9yZGVyZWQgPC0gZ3JvdXBlZFtvcmRlcihncm91cGVkJEFuemFobCksIGRlY3JlYXNpbmcgPSBGQUxTRV0NCm9yZGVyZWQkR2VucmUgPC0gYXNfZmFjdG9yKG9yZGVyZWQkR2VucmUpDQoNCg0KYXggPC0gbGlzdCgNCiAgdGl0bGUgPSAiR2VucmUiDQopDQoNCmF5IDwtIGxpc3QoDQogIHRpdGxlID0gIkFuemFobCINCg0KKQ0KDQpvcmRlcmVkJT4lDQogIHBsb3RfbHkoKSAlPiUgDQogIGFkZF9iYXJzKHg9fmZjdF9yZW9yZGVyKEdlbnJlLEFuemFobCwgLmRlc2M9InRydWUiKSwNCiAgICAgICAgICAgeT1+QW56YWhsLA0KICAgICAgICAgICBuYW1lPSJBbW91bnQgYnkgR2VucmUiKSAlPiUgDQogIGxheW91dCh0aXRsZT0iQW1vdW50IGJ5IEdlbnJlIiwNCiAgICAgICAgIHhheGlzID0gYXgsDQogICAgICAgICB5YXhpcyA9IGF5DQogICAgICAgICApDQoNCm9yZGVyZWQlPiUNCiAgcGxvdF9seSgpICU+JSANCiAgYWRkX3BpZSh2YWx1ZXMgPX5BbnphaGwsbGFiZWxzPX5HZW5yZSwNCiAgICAgICAgICAgbmFtZT0iQW1vdW50IGJ5IEdlbnJlIikgJT4lIA0KICBsYXlvdXQodGl0bGU9IkFtb3VudCBieSBHZW5yZSIsDQogICAgICAgICB4YXhpcyA9IGF4LA0KICAgICAgICAgeWF4aXMgPSBheQ0KICAgICAgICAgKQ0KYGBgDQpgYGB7ciBwbG90KFNhbGVzQnlHZW5yZSksIGVjaG8gPSBUUlVFLCBtZXNzYWdlPUZBTFNFLCByZXN1bHRzPSdtYXJrdXAnLCB9DQoNCmdyb3VwZWQgPC0gdmdzYWxlcyAgJT4lIA0KICBncm91cF9ieShHZW5yZSkgJT4lIA0KICBzdW1tYXJpemUoc3VtKEdsb2JhbF9TYWxlcykpICAlPiUNCnJlbmFtZSgNCiAgICBHbG9iYWxfU2FsZXMgPSAic3VtKEdsb2JhbF9TYWxlcykiDQogICAgKQ0KZ3JvdXBlZCRHbG9iYWxfU2FsZXM8LWFzX3ZlY3Rvcihncm91cGVkJEdsb2JhbF9TYWxlcykNCm9yZGVyZWQgPC0gZ3JvdXBlZFtvcmRlcihncm91cGVkJEdsb2JhbF9TYWxlcyksIGRlY3JlYXNpbmcgPSBGQUxTRV0NCg0KYXggPC0gbGlzdCgNCiAgdGl0bGUgPSAiR2VucmUiDQopDQoNCmF5IDwtIGxpc3QoDQogIHRpdGxlID0gIlNhbGVzIg0KDQopDQoNCm9yZGVyZWQlPiUNCiAgcGxvdF9seSgpICU+JSANCiAgYWRkX2JhcnMoeD1+ZmN0X3Jlb3JkZXIoR2VucmUsR2xvYmFsX1NhbGVzLCAuZGVzYz0idHJ1ZSIpLA0KICAgICAgICAgICB5PX5HbG9iYWxfU2FsZXMsDQogICAgICAgICAgIG5hbWU9IlNhbGVzIGJ5IEdlbnJlIikgJT4lIA0KICBsYXlvdXQodGl0bGU9IlNhbGVzIGJ5IEdlbnJlIiwNCiAgICAgICAgIHhheGlzID0gYXgsDQogICAgICAgICB5YXhpcyA9IGF5DQogICAgICAgICApDQoNCm9yZGVyZWQlPiUNCiAgcGxvdF9seSgpICU+JSANCiAgYWRkX3BpZSh2YWx1ZXMgPX5HbG9iYWxfU2FsZXMsbGFiZWxzPX5HZW5yZSwNCiAgICAgICAgICAgbmFtZT0iU2FsZXMgYnkgR2VucmUiKSAlPiUgDQogIGxheW91dCh0aXRsZT0iU2FsZXMgYnkgR2VucmUiLA0KICAgICAgICAgeGF4aXMgPSBheCwNCiAgICAgICAgIHlheGlzID0gYXkNCiAgICAgICAgKQ0KYGBgDQoNCmBgYHtyIHBsb3QoU2FsZXNCeUdlbnJlYnlZZWFyKSwgZWNobyA9IFRSVUUsIG1lc3NhZ2U9RkFMU0UsIHJlc3VsdHM9J21hcmt1cCcsIH0NCg0KZ3JvdXBlZCA8LSB2Z3NhbGVzICAlPiUgDQogIGdyb3VwX2J5KEdlbnJlKQ0KZmlsdGVyZWQgPC0gZ3JvdXBlZCAlPiUgc2VsZWN0KFllYXIsR2VucmUpDQp0eXBlb2YodmdzYWxlcykNCnR5cGVvZihmaWx0ZXJlZCkNCnZpZXcoZmlsdGVyZWQpDQpmaWx0ZXJlZCAlPiUNCnBsb3RfbHkoKSAlPiUgDQogIGFkZF9iYXJzKHg9flllYXIsDQogICAgICAgICAgIHk9fkdlbnJlKQ0KI2R5Z3JhcGgoZmlsdGVyZWQpDQpgYGANCg0K4pePIEdpYnQgZXMgU3RhdGlzdGlzY2hlIHp1c2FtbWVuaMOkbmdlIHp3aXNjaGVuIGVpbnplbG5lbiBGYWt0b3JlbiBlLmcuIEdlbnJlIC0+DQpTYWxlcw0K4pePIFdlbGNoZSBKYWhyZSBzaW5kIGRpZSBiZXN0ZW4gaW4gZGVyIEFuemFobCBkZXIgcmVsZWFzdGVuIGdhbWVzDQril48gV2VsY2hlIEphaHJlIHNpbmQgZGllIGJlc3RlbiBpbiBBbnphaGwgU2FsZXMgcHJvIGdhbWUgKG5ldWVyID0gYmVzc2VyPykNCg==